﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SoftwareConsulting.Interfaces.BasicEntities;
using SoftwareConsulting.BI11.Studio.InternalServices;

namespace SoftwareConsulting.BI11.Studio.BasicEntities
{    
    /// <summary>
    /// Класс нечто уникального, имеющего родителя
    /// </summary>
    [Serializable]
    public abstract class UniqueChild : Unique, IUniqueChild
    {
        private IUnique _parent; //родитель     

        /// <summary>
        /// Возвращает/устанавливает родителя
        /// </summary>        
        public virtual IUnique Parent
        {
            get
            {
                return _parent;
            }
            set
            {                
                if (Parent != null) //первый раз проверять не надо, т.к. первый раз происходит еще в конструкторе, когда элемент не создался                   
                    //кроме того, не надо проверять если парентом установили ничего
                {
                    IHierarchy<IUniqueChild> hierarchy = value as IHierarchy<IUniqueChild>;
                    Assert.FailIf((hierarchy != null) && (!hierarchy.Contains(this)), Assert.Id.Assert00010);
                }
                _parent = value;
            }
        }

        /// <summary>
        /// Конструктор класса
        /// </summary>
        /// <param name="owner"></param>
        protected UniqueChild(IUnique owner)
        {
            Parent = owner;
        }

        /// <summary>
        /// Конструктор класса по умолчанию
        /// </summary>
        protected UniqueChild():base()
        {
            //нафиг надо? из-за этого проблемы с переопределением Parent в дочерних классах Parent = null;
        }
    }
}
